package com.chenziwen.scala.chapter08

object Scala15_Match5 {
  def main(args: Array[String]): Unit = {
    val list = List(1, 2, 3, 4, "abc")

    def addOne(a: Any): Any = {
      a match {
        case x: Int => x + 1
        case _ => a
      }
    }

    println(list.map(addOne))

    // 偏函数
    // 使用匿名子类的形式，必须实现两个方法，当isDefinedAt返回为true时，会自动为传进来的每个参数调用apply方法
    val add = new PartialFunction[Any, Int] {
      override def apply(a: Any): Int = a.asInstanceOf[Int] + 1

      override def isDefinedAt(x: Any): Boolean = if (x.isInstanceOf[Int]) true else false
    }

    // 偏函数必须使用collect来调用
    println(list.collect(add))

    // 偏函数的简单写法
    def add2: PartialFunction[Any, Int] = {
      // case语句会自动转换为偏函数
      case i: Int => i + 1
    }

    println(list.collect(add2))

    // 偏函数的更简单的写法
    println(list.collect { case i: Int => i + 1 })
  }
}
